package edu.cuit.avatar;

import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 随机访问文件：使用RandomAccessFile类打开的文件称为随机访问文件，允许在文件的任意位置进行读写.(适合经常更新的文件)
 *      public class RandomAccessFile implements DataOutput, DataInput, Closeable
 *
 *
 * @author <a href="mailto:1020zhaodan@163.com">Adan</a>
 * @version 1.0
 * @date 2025/7/12 15:13
 *
 * 图书管理系统：使用文件保存图书信息
 * 1    think in java    bruce    108    机械工业出版社
 * 2    天龙八部     金庸    30    三联出版社
 *
 *
 * 界面
 *      欢迎使用图书管理系统
 *      i. 添加新的图书
 *      d. 删除图书信息
 *      u. 更新图书信息
 *      a. 加载所有的图书信息
 *      f. 查找指定的图书信息
 *
 * i. 添加新的图书
 *      提示用户输入图书名称,图书作者,价格及出版社
 *      自动生成id(唯一):当前图书列表中最大的id + 1
 *      在文件末尾添加新的图书
 * d. 删除图书信息
 *      提示用户输入图书id,根据id完成图书的删除
 *
 * u. 更新图书信息
 *      提示用户输入图书id
 *          1.图书存在,先打印修改前的内容,然后提示用户输入相关信息(图书名称,图书作者,价格及出版社)完成修改
 *          2.图书不存在,给出提示
 *
 * a. 加载所有的图书信息
 *      1    think in java    bruce    108    机械工业出版社
 *      2    天龙八部     金庸    30    三联出版社
 *
 * f. 查找指定的图书信息
 *      提示用户输入图书id
 *      1    think in java    bruce    108    机械工业出版社
 *
 * 要求: 面向对象的程序设计原则
 *      1. 单一职责 ====>图书只描述图书本身信息
 *      2. 开闭原则 ====>图书的业务功能使用接口定义来达到对功能进行扩展
 *
 */
public class RandomAccessFileTest {
    public static void main(String[] args) {
        /*
         * RandomAccessFile(fileName: String, mode: String):使用指定的文件名和mode创建RandomAccessFile流
         * RandomAccessFile(file: File, mode: String):使用指定的文件和mode创建RandomAccessFile流
         *      mode: "r", "rw", "rws", or "rwd"
         *          "r": 只读
         *          "rw": 可读写
         * getFilePointer(): long 返回以字节计算的从文件开始的偏移量,下一次的read或write将从该位置开始
         * length(): long 返回文件中的字节数(大小)
         * setLength(length: long) 为文件设置一个新的大小
         * seek(pos: long): 设置的偏移量,下一次的read或write将从该偏移量位置开始
         *
         */
        try(var raf = new RandomAccessFile("books.txt", "rw")){
            raf.setLength(0);

            //向文件中写入200个整型数据
            for(var i = 0; i < 200; i++)
                raf.writeInt(i);

            System.out.println("current file length is " + raf.length() + " bytes");

            //将读写偏移量移动到文件开始的地方
            raf.seek(0);
            System.out.println("the first number is " + raf.readInt());
            //raf.seek(4);
            System.out.println("the second number is " + raf.readInt());
            //设置偏移量
            raf.seek(9 * 4);
            System.out.println("the tenth number is " + raf.readInt());

            System.out.println("pointer = " + raf.getFilePointer());

            //在文件结尾添加新的数据
            raf.seek(raf.length());
            raf.writeUTF("图书管理系统");

            System.out.println("current file length is " + raf.length() + " bytes");
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}
